#include <bits/stdc++.h>
#define int long long 
using namespace std;

const int maxn = 1e5 + 5;
int n;

struct Edge{
	int to, nxt, val;	
}Edge, edges[maxn<<1];
int head[maxn], cnt;


int up[maxn], down1[maxn], down2[maxn];
int from[maxn]; // 记录 down1[i] 从那个子树过来


// 求出 down
void dfs1(int u, int p){
	for (int i=head[u];i;i=edges[i].nxt) {
		int to=edges[i].to;
		int val = edges[i].val;
		if (to==p) {
			continue;
		}
		dfs1(to, u);
		if (down1[to]+val>down1[u]) {
			// 更新最大值前先记录次大值
			down2[u] = down1[u];
			down1[u] = down1[to]+val;
			from[u] = to;
		} else if (down1[to]+val>down2[u]) {
			// 不更新最大值, 但是比 次大值大
			down2[u] =down1[to]+val; 
		}
	}
}

// 求出 up
void dfs2(int u, int p){
	for (int i=head[u];i;i=edges[i].nxt) {
		int to=edges[i].to;
		int val = edges[i].val;
		if (to==p) {
			continue;
		}
		// 因为需要使用父亲节点的,所以需要先出来再 dfs
		up[to] = max(up[to], up[u]+val);
		
		// 同时 up 还可以由 down 更新过来
		if (from[u] != to) {
			// 不是同一个子树 才可以 从最大值更新过来
			up[to] = max(up[to], down1[u]+val); 
		} else {
			// 只能从 次大值更新过来
			up[to] = max(up[to], down2[u]+val); 			
		}
		// 父亲节点处理过后才能 dfs
		dfs2(to, u);
	}
}


void add(int from, int to, int val){
	edges[++cnt].nxt = head[from];
	edges[cnt].to = to;
	edges[cnt].val = val;
	head[from]=cnt;
}




void solve(){
	cin >>n;
	for (int i=1;i<n;i++) {
		int a,b, c;
		cin >>a>>b>>c;
		add(a,b,c);
		add(b,a,c);
	}
	
	// 第一次 dfs 求出 down1 down2
	dfs1(1, 0);
	
	// 第二次求出 up
	dfs2(1, 0);
	
	
	int ans = 0;
	for (int i=1;i<=n;i++) {
		ans = max(ans, down1[i]*max(up[i], down2[i]));
	}
	cout << ans <<'\n';
	
}

signed main(){
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	solve();
	return 0;
}
